package com.shujia.day08;


abstract class AbstractClass{

    public abstract void abstractFun();
}

// 实体类继承了抽象类 实现抽象方法
class EntityClas extends AbstractClass {

    @Override
    public void abstractFun() {
        System.out.println("实体类继承抽象类，实现抽象方法了..");
    }
}

interface Inter{
    void print();

    AbstractClass getAbstractClass();
}



public class Code06NiMingInnerClass {
    public static void main(String[] args) {

        /*
            匿名内部类：
                在创建实例对象时，如果给定的类是一个抽象类，其中有抽象方法，那么在给定对象时，需要对抽象方法/接口进行重写
                    格式如下：
                抽象类名/接口 对象名 =  new 抽象类名/接口{
                      重写抽象方法
                }


            自从有了匿名内部类，就不需要再定义一个子类进行继承或实现抽象方法，使用简单方便，
                但是匿名内部类重写的方法，只在当前的对象中有效，其他对象要创建需要再重写对应方法



         */

        // 定义了一个抽象类中的抽象方法，如果要调用，那么怎么做
        //    根据之前所学内容，抽象的方法调用需要 定义一个子类 对抽象类 进行继承 重写抽象方法

        AbstractClass entityClas = new EntityClas();
        entityClas.abstractFun();

        AbstractClass abstractClass = new AbstractClass() {
            @Override
            public void abstractFun() {
                System.out.println("抽象类的抽象方法，在创建对象时，需要实现其抽象方法..");
            }
        };

        abstractClass.abstractFun();


        // 接口的匿名内部类使用
//        Inter inter = new Inter() {
//            @Override
//            public void print() {
//                System.out.println("这是接口中重写的方法..");
//            }
//        };

//        inter.print();

        Inter inter = new Inter() {
            @Override
            public void print() {
                System.out.println("这是接口中重写的方法..");
            }

            @Override
            public AbstractClass getAbstractClass() {
                return new AbstractClass() {
                    @Override
                    public void abstractFun() {
                        System.out.println("这是接口中返回的抽象类的匿名内部类的对象..");
                    }
                };
            }
        };

        inter.getAbstractClass().abstractFun();


    }
}
